home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / public / plan / src / parser.y < prev    next >
Text File  |  1994-08-01  |  3KB  |  105 lines

  1. %{
  2. extern char    *mystrdup();
  3. extern int     parse_year;
  4. int         yacc_small;
  5. int         yacc_stringcolor;
  6. char        *yacc_string;
  7. int         yacc_daycolor;
  8. static int     m, d, y;
  9. %}
  10.  
  11. %union { int ival; char *sval; }
  12. %type  <ival> color offset length expr pexpr number month
  13. %token <ival> NUMBER MONTH WDAY COLOR
  14. %token <sval> STRING
  15. %token        IN PLUS MINUS SMALL CYEAR LEAPYEAR
  16. %token        LENGTH EASTER EQ NE LE GE LT GT
  17.  
  18. %left OR
  19. %left AND
  20. %right EQ NE LE GE LT GT
  21. %left '-' '+'
  22. %left '*' '/'
  23. %nonassoc '!'
  24. %nonassoc UMINUS
  25. %left '?' ':'
  26.  
  27. %start list
  28.  
  29. %%
  30. list    :
  31.     | list small color STRING color        { yacc_stringcolor = $3;
  32.                           yacc_string      = $4;
  33.                           yacc_daycolor    = $5; }
  34.       entry                    { free(yacc_string); }
  35.     ;
  36.  
  37. small    :                    { yacc_small = 0; }
  38.     | SMALL                    { yacc_small = 1; }
  39.     ;
  40.  
  41. color    :                    { $$ = 0; }
  42.     | COLOR                    { $$ = $1; }
  43.     ;
  44.  
  45. entry    : EASTER offset length            { seteaster($2, $3); }
  46.     | date offset length            { setdate( m,  d,  y, $2, $3);}
  47.     | WDAY offset length            { setwday( 0, $1,  0, $2, $3);}
  48.     | NUMBER WDAY offset length        { setwday($1, $2,  0, $3, $4);}
  49.     | NUMBER WDAY IN month offset length    { setwday($1, $2, $4, $5, $6);}
  50.     | WDAY NUMBER date offset length    { setdoff($1, $2,m,d,y,$4,$5);}
  51.     ;
  52.  
  53. offset    :                    { $$ =   0; }
  54.     | PLUS NUMBER                { $$ =  $2; }
  55.     | MINUS NUMBER                { $$ = -$2; }
  56.     ;
  57.  
  58. length    :                    { $$ =   1; }
  59.     | LENGTH NUMBER                { $$ =  $2; }
  60.     ;
  61.  
  62. date    : pexpr '.' month            { m = $3; d = $1; y = 0;  }
  63.     | pexpr '.' month '.'            { m = $3; d = $1; y = 0;  }
  64.     | pexpr '.' month '.' expr        { m = $3; d = $1; y = $5; }
  65.     | month '/' pexpr            { m = $1; d = $3; y = 0;  }
  66.     | month '/' pexpr '/' pexpr        { m = $1; d = $3; y = $5; }
  67.     | MONTH pexpr                { m = $1; d = $2; y = 0;  }
  68.     | MONTH pexpr pexpr            { m = $1; d = $2; y = $3; }
  69.     | pexpr MONTH                { m = $2; d = $1; y = 0;  }
  70.     | pexpr MONTH pexpr            { m = $2; d = $1; y = $3; }
  71.     | pexpr '.' MONTH            { m = $3; d = $1; y = 0;  }
  72.     | pexpr '.' MONTH pexpr            { m = $3; d = $1; y = $4; }
  73.     ;
  74.  
  75. month    : MONTH | pexpr;
  76.  
  77. expr    : pexpr                    { $$ = $1; }
  78.     | expr OR  expr                { $$ = $1 || $3; }
  79.     | expr AND expr                { $$ = $1 && $3; }
  80.     | expr EQ  expr                { $$ = $1 == $3; }
  81.     | expr NE  expr                { $$ = $1 != $3; }
  82.     | expr LE  expr                { $$ = $1 <= $3; }
  83.     | expr GE  expr                { $$ = $1 >= $3; }
  84.     | expr LT  expr                { $$ = $1 <  $3; }
  85.     | expr GT  expr                { $$ = $1 >  $3; }
  86.     | expr '+' expr                { $$ = $1 +  $3; }
  87.     | expr '-' expr                { $$ = $1 -  $3; }
  88.     | expr '*' expr                { $$ = $1 *  $3; }
  89.     | expr '/' expr                { $$ = $3 ?  $1 / $3 : 0; }
  90.     | expr '%' expr                { $$ = $3 ?  $1 % $3 : 0;}
  91.     | expr '?' expr ':' expr        { $$ = $3 ?  $1 % $3 : 0;}
  92.     | '!' expr                { $$ = !$2; }
  93.     ;
  94.  
  95. pexpr    : '(' expr ')'                { $$ = $2; }
  96.     | number                { $$ = $1; }
  97.     ;
  98.  
  99. number    : NUMBER
  100.     | '-' NUMBER %prec UMINUS        { $$ = -$2; }
  101.     | CYEAR                    { $$ = parse_year; }
  102.     | LEAPYEAR pexpr            { $$ = !(($2) & 3); }
  103.     ;
  104. %%
  105.